package main.java;

/**
 * @program: pratice
 * @author: 关键我是大怪
 * @create: 2021-11-15 20:10
 */

/**
 * 题目：
 * <p>
 * 初始时有 n 个灯泡处于关闭状态。第一轮，你将会打开所有灯泡。接下来的第二轮，你将会每两个灯泡关闭一个。
 * 第三轮，你每三个灯泡就切换一个灯泡的开关（即，打开变关闭，关闭变打开）。第 i 轮，你每 i 个灯泡就切换一个灯泡的开关。直到第 n 轮，你只需要切换最后一个灯泡的开关。
 * 找出并返回 n 轮后有多少个亮着的灯泡。
 * <p>
 * 示例：
 * 输入：n = 3
 * 输出：1
 * 解释：
 * 初始时, 灯泡状态 [关闭, 关闭, 关闭].
 * 第一轮后, 灯泡状态 [开启, 开启, 开启].
 * 第二轮后, 灯泡状态 [开启, 关闭, 开启].
 * 第三轮后, 灯泡状态 [开启, 关闭, 关闭].
 * <p>
 * 你应该返回 1，因为只有一个灯泡还亮着。
 * <p>
 * 思路：
 * 从题可知，第n个灯泡开关的变化次数为 n 的约数的个数
 * 如果约数数量为偶数，则灯泡为关闭，如果为奇数，则最终为打开
 * 所以 我们只要求 [1,n]之间奇数的个数是多少，
 * 并且约数成对出现，所以要满足数量为基数说明存在 x 平方等于 n
 * 所以数量为 n 的根
 */

public class Test79_灯泡开关 {
    public int bulbSwitch(int n) {
        return (int) Math.sqrt(n);
    }
}
